import os
import sys
import re
import shutil  # 新增shutil模块用于目录复制和删除

def replace_file_content(file_path, old_str, new_str):
    """
    替换文件内容中的指定字符串

    参数:
    file_path: 文件路径
    old_str: 要被替换的字符串
    new_str: 替换后的新字符串
    """
    try:
        # 检测文件大小，避免处理大文件
        if os.path.getsize(file_path) > 10 * 1024 * 1024:  # 10MB
            print(f"跳过大文件: {file_path} (大小: {os.path.getsize(file_path) // 1024}KB)")
            return False

        # 读取文件内容
        with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
            content = f.read()

        # 执行替换操作
        if old_str in content:
            new_content = content.replace(old_str, new_str)

            # 写回文件
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(new_content)
            return True
        return False
    except Exception as e:
        print(f"文件内容替换失败 {file_path}: {str(e)}")
        return False


def batch_rename_files_and_folders(root_path, old_str, new_str):
    """
    递归遍历文件夹，批量替换：
    1. 文件名中的指定字符串
    2. 文件夹名中的指定字符串
    3. 文件内容中的指定字符串

    参数:
    root_path: 要处理的根目录路径
    old_str: 要被替换的字符串
    new_str: 替换后的新字符串
    """
    # 计数器初始化
    renamed_files = 0
    renamed_folders = 0
    content_replaced_files = 0

    # 支持的文件类型（可根据需要扩展）
    text_file_extensions = ['.txt', '.py', '.md', '.java', '.css', '.js', '.json', '.xml', '.csv', '.ini', '.cfg']

    # 递归遍历所有文件（自底向上）
    for root, dirs, files in os.walk(root_path, topdown=False):
        # 首先处理文件内容替换（不改变路径）
        for name in files:
            file_path = os.path.join(root, name)

            # 检查是否为文本文件
            if any(name.lower().endswith(ext) for ext in text_file_extensions):
                if replace_file_content(file_path, old_str, new_str):
                    print(f"内容替换: {file_path}")
                    content_replaced_files += 1

        # 然后处理文件重命名
        for name in files:
            file_path = os.path.join(root, name)

            if old_str in name:
                new_name = name.replace(old_str, new_str)
                new_path = os.path.join(root, new_name)

                try:
                    os.rename(file_path, new_path)
                    print(f"文件重命名: {file_path} → {new_path}")
                    renamed_files += 1
                except Exception as e:
                    print(f"重命名文件失败 {file_path}: {str(e)}")

    # 最后处理文件夹重命名（自底向上）
    for root, dirs, files in os.walk(root_path, topdown=False):
        for name in dirs:
            dir_path = os.path.join(root, name)

            if old_str in name:
                new_name = name.replace(old_str, new_str)
                new_path = os.path.join(root, new_name)

                try:
                    os.rename(dir_path, new_path)
                    print(f"文件夹重命名: {dir_path} → {new_path}")
                    renamed_folders += 1
                except Exception as e:
                    print(f"重命名文件夹失败 {dir_path}: {str(e)}")

    return renamed_files, renamed_folders, content_replaced_files


def backup_directory(src_dir, backup_dir):
    """
    备份目录到指定位置，如果备份目录已存在则删除

    参数:
    src_dir: 源目录路径
    backup_dir: 备份目录路径
    """
    try:
        # 如果备份目录已存在，则删除
        if os.path.exists(backup_dir):
            print(f"备份目录已存在: {backup_dir}")
            shutil.rmtree(backup_dir)  # 递归删除整个目录[7,8](@ref)
            print(f"已删除备份目录: {backup_dir}")

        # 复制整个目录[9,10,11](@ref)
        shutil.copytree(src_dir, backup_dir)
        print(f"已创建备份: {src_dir} → {backup_dir}")
        return backup_dir

    except Exception as e:
        print(f"备份失败: {str(e)}")
        sys.exit(1)


if __name__ == "__main__":
    # 修改后的参数处理（增加备份目录参数）
    if len(sys.argv) != 5:
        print("使用方法: python enhanced_rename_script.py [原始目录] [备份目录] [旧字符串] [新字符串]")
        print("示例: python enhanced_rename_script.py /path/to/source /path/to/backup XXX NewName")
        sys.exit(1)

    source_dir = sys.argv[1]  # 原始目录
    backup_dir = sys.argv[2]  # 备份目录
    old_str = sys.argv[3]  # 旧字符串
    new_str = sys.argv[4]  # 新字符串

    # 验证原始目录是否存在
    if not os.path.exists(source_dir):
        print(f"错误: 原始目录 '{source_dir}' 不存在")
        sys.exit(1)

    # 安全警告
    print("\n⚠️ 警告: 此操作将备份并修改文件，原始目录保持不变!")
    print(f"原始目录: {source_dir}")
    print(f"备份目录: {backup_dir}\n")

    # 执行目录备份
    print("=" * 50)
    work_dir = backup_directory(source_dir, backup_dir)
    print("=" * 50 + "\n")

    # 执行批量重命名和内容替换（在备份目录上操作）
    print(f"开始处理目录: {work_dir}")
    print(f"替换规则: '{old_str}' → '{new_str}'\n")

    file_count, folder_count, content_count = batch_rename_files_and_folders(work_dir, old_str, new_str)

    print("\n操作完成!")
    print(f"重命名文件数量: {file_count}")
    print(f"重命名文件夹数量: {folder_count}")
    print(f"内容替换文件数量: {content_count}")
    print(f"总计处理: {file_count + folder_count + content_count} 个项目")